package com.example.empleemanagesystem.service;

import com.example.empleemanagesystem.entity.Attendance;
import com.example.empleemanagesystem.vo.AttendanceVO;
import org.springframework.lang.NonNull;

import java.util.List;
import java.util.Optional;

// 定义了考勤相关业务逻辑的接口，具体的业务逻辑实现由实现了这个接口的类来完成，这样做便于进行接口和实现的分离以及代码的解耦
public interface AttendanceService {
    // 获取所有考勤记录（以AttendanceVO形式返回），用于在业务逻辑层提供统一的获取所有考勤数据的方法声明
    List<AttendanceVO> findAll();

    /**
     * 通过用户名获取考勤
     * @param name 要查找考勤记录对应的用户名，通过这个用户名去数据库中查找相关的考勤信息
     * @return 返回一个Optional类型的Attendance对象，Optional用于避免空指针异常，若找到对应的考勤记录则返回包含该记录的Optional对象，否则返回空的Optional对象
     */
    Optional<Attendance> getByName(@NonNull String name);

    // 通过员工编号获取考勤
    // @param number 要查找考勤记录对应的员工编号，通过这个编号去数据库中查找相关的考勤信息
    // @return 返回一个Optional类型的Attendance对象，若找到对应的考勤记录则返回包含该记录的Optional对象，否则返回空的Optional对象
    Optional<Attendance> getByNumber(@NonNull String number);

    /**
     * 创建用户考勤
     * @param attendanceVO 包含要创建的考勤记录相关信息的AttendanceVO对象，将根据这个对象中的数据创建新的考勤记录并存入数据库
     * @return 如果考勤记录创建成功则返回true，若在创建过程中出现异常（比如数据库操作失败等情况）则返回false
     */
    boolean create(@NonNull AttendanceVO attendanceVO);

    // 根据考勤记录的唯一标识（ID）获取对应的考勤记录
    // @param id 要获取的考勤记录的ID值，通过这个ID在数据库中查找对应的考勤记录
    // @return 返回对应的Attendance对象，如果没有找到则返回null
    Attendance getById(@NonNull Long id);

    // 根据考勤记录的唯一标识（ID）删除对应的考勤记录
    // @param id 要删除的考勤记录的ID值，通过这个ID在数据库中执行删除操作
    void deleteById(@NonNull Long id);
}